package juc;


/*
 * Author：江松
 * Date：2023/3/27 19:48
 *
 ThreadLocal是线程本地存储，在每个线程中都创建了一个 ThreadLocalMap 对象，
 每个线程可以访问自己内部 ThreadLocalMap 对象内的 value。

 经典的使用场景是为每个线程分配一个 JDBC 连接 Connection。
 这样就可以保证每个线程的都在各自的 Connection 上进行数据库的操作，
 不会出现 A 线程关了 B线程正在使用的 Connection； 还有 Session 管理 等问题。

 运行结果：每个线程自己的变量然后加到5，而不是线程之间共享变量加到15
 */

public class TestThreadLocal {

        //线程本地存储变量
        private static final ThreadLocal<Integer> THREAD_LOCAL_NUM = new ThreadLocal<Integer>() {
            @Override
            protected Integer initialValue() {
                return 0;
            }
        };

        public static void main(String[] args) {
            for (int i = 0; i < 3; i++) {//启动三个线程
                Thread t = new Thread() {
                    @Override
                    public void run() {
                        add10ByThreadLocal();
                    }
                };
                t.start();
            }
        }

        /**
         * 线程本地存储变量加 5
         */
        private static void add10ByThreadLocal() {
            for (int i = 0; i < 5; i++) {
                Integer n = THREAD_LOCAL_NUM.get();
                n += 1;
                THREAD_LOCAL_NUM.set(n);
                System.out.println(Thread.currentThread().getName() + " : ThreadLocal num=" + n);
            }
        }


}
